/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DBLag;
import ModelLag.*;
import java.sql.*;
import java.util.ArrayList;


/**
 * Databaseklasse for Menu som står for kommunikationen til databasen og som står
 * for opbygningen af Menu objekter som skal bruges i de højere lag.
 * @author DM75 Gruppe 3
 * @version 2011-12-22
 */
public class DbMenu implements IFDbMenu
{
    //Forbindelse til databasen.
    private Connection con;
    
    // En instans variabel af typen PreparedStatement som indeholder et PreparedStatement
    // til brug ved findmetode.
    PreparedStatement pStmtSelect;
    
    public DbMenu()
    {
        con = DbConnection1.getInstance().getDBcon();
    }
    /**
     * Finder en event i databasen og sørger for at det bliver bygget op til et 
     * objekt ved hjælp af buildMenu() og menu navn og beskrivelse.
     * @param menuName Menu navn.
     * @return Hvis fundet returneres et Event objekt ellers null.
     */       
    @Override
    public Menu findMenu(String menuName, boolean retriveAssociation)
    {
        if(pStmtSelect == null)
        {
            pStmtSelect = getPreparedStmt();
        }
        Menu menuObj = null;
        ResultSet results;
        
        try
        {
            pStmtSelect.setString(1, menuName);
            results = pStmtSelect.executeQuery();
            if(results.next())
            {
                menuObj = buildMenu(results);
            }
        }
        catch(SQLException sqlE)
        {
            System.out.println(sqlE.getMessage());
            System.out.println("SQL Error");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return menuObj;  
    }

    /**
     * Henter alle rækker i Menu tabellen i databasen og bygger dem op til objekter ved hjælp af
     * buildMenu() og derefter tilføjes hvert objekt til en ArrayList.
     * @return ArrayList med alle menu som findes i Menu tabellen i databasen.
     */    
    @Override
    public ArrayList<Menu> getAllMenus()
    {
        ArrayList<Menu> list = new ArrayList<Menu>();
        PreparedStatement pstmt = null;
        
        String allMenu = "SELECT * FROM Menu ORDER BY menuName";
        
        //System.out.println(allMenu);
        
        Menu menuObj = null;
        ResultSet results;
        
        try
        {
            pstmt = con.prepareStatement(allMenu);
            pstmt.setQueryTimeout(5);
            results = pstmt.executeQuery();
            while(results.next())
            {
               menuObj = buildMenu(results);
               list.add(menuObj);
            }
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println(sqlE.getMessage());
            System.out.println("SQL Error");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return list;
    }

    /**
     * Indsætter et Menu objekt som en række i Menu tabellen i databasen.
     * @param menuObj Det objekt som ønskes indsat i Menu tabellen i databasen.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */   
    @Override
    public int insertMenu(Menu menuObj, boolean retriveAssociation)
    {
        int rc = -1;
        PreparedStatement pstmt = null;
        String insert = "INSERT INTO Menu (menuName, description)" + "VALUES (?,?)";
        //System.out.println(insert);
        try
        {
            pstmt = con.prepareStatement(insert);
            pstmt.setQueryTimeout(5);
            pstmt.setString(1, menuObj.getMenuName());
            pstmt.setString(2, menuObj.getDescription());
            rc = pstmt.executeUpdate();
            
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage());

        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());

        }
        return rc;
    }

    /**
     * Sletter rækken i Menu tabellen i databasen ved hjælp af parameterne.
     * @param menuName menu navn.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */      
    @Override
    public int deleteMenu(String menuName)
    {
        int rc = -1;
        PreparedStatement pstmt = null;
        String delete = "DELETE FROM Menu WHERE menuName = ?";
        System.out.println(delete);
        try
        {
            pstmt = con.prepareStatement(delete);
            pstmt.setQueryTimeout(5);
            pstmt.setString(1, menuName);
            rc = pstmt.executeUpdate();
            
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage()); 
        }
        catch(Exception e)
        {
            e.getMessage();
        }
        return rc;
    }

    /**
     * Opdaterer rækken i Menu tabellen i databasen i forhold til event objektet.
     * @param menuObj Menu objekt som er det der skal opdateres.
     * @param description Beskrivelse på hvordan menuen er opbygget.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */      
    @Override
    public int updateMenu(Menu menu)
    {

        int rc = -1;
        
        String query = null;

        try
        {
        
            query = "UPDATE Menu " 
                  + "SET description = ? "
                  + "WHERE menuName = ? ";

            PreparedStatement preStmnt = con.prepareStatement(query);
            preStmnt.setQueryTimeout(5);


            preStmnt.setString(1, menu.getDescription());
            preStmnt.setString(2, menu.getMenuName());
 
            rc = preStmnt.executeUpdate();
            
            preStmnt.close();
                
        }
        catch(SQLException SQLe)
        {
            //returnerer SQL Exception
            System.out.println("SQL Error: " + SQLe.getMessage());

        }
        catch(Exception e)
        {
            //returnerer java exception
            System.out.println("ExceptionE: " + e.getMessage());

        }        
        return rc;
    }
    
    /**
     * Opbygning af Menu objekt sker i denne metode.
     * @param results ResultSet. En form for tabel med resultaterne i fra det
     * preparedstatement som er sendt til databasen.
     * @return Menu objekt.
     */    
    private Menu buildMenu(ResultSet results)
    {
        Menu menuObj = new Menu();
        try
        {   
            menuObj.setMenuName(results.getString("menuName"));
            menuObj.setDescription(results.getString("description"));
            
        }
        catch(Exception e)
        {
            System.out.println("Error in Building Menu Object");
        }
        return menuObj;
    }
    
    /**
     * PreparedStatement som bruges til find metoden ud fra menuName. Dette laves en gang og gemmes
     * derefter i en instans variabel, da dette preparedStatement bruges ofte kan
     * dette betale sig at gemme og derved går det hurigtere end hvis man skal til at
     * lave et nyt hver gang.
     * @return PreparedStatement objekt.
     */    
    private PreparedStatement getPreparedStmt()
    {
        try
        {
            String query = "SELECT menuName, description "
                         + "FROM Menu "
                         + "WHERE menuName = ?";
            System.out.println("Preparestatement " + query);
            pStmtSelect = con.prepareStatement(query);
            pStmtSelect.setQueryTimeout(5);
        }
        catch(SQLException sqlE)
        {
            System.out.println(sqlE.getMessage());
            System.out.println("SQL Error");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        return pStmtSelect;
    }
    
}
